#ifndef __APP_UPDATE_H
#define __APP_UPDATE_H

#include "gd32f4xx.h"
#include <string.h>

// 协议常量定义
#define FRAME_SOF           0xAA    // 帧头
#define FRAME_MAX_SIZE      256     // 最大帧长度

// 命令定义 - 与上位机兼容
#define CMD_UPDATE_REQ      0x01    // 升级请求 (与上位机CMD_START对应)
#define CMD_UPDATE_ACK      0x80    // 升级确认 (与上位机CMD_ACK对应)
#define CMD_UPDATE_DATA     0x02    // 升级数据 (与上位机CMD_DATA对应)
#define CMD_UPDATE_END      0x03    // 升级结束 (与上位机CMD_FINISH对应)
#define CMD_UPDATE_VERIFY   0x04    // 升级验证
#define CMD_UPDATE_RESET    0x05    // 系统复位
#define CMD_UPDATE_NACK     0x81    // 错误响应 (与上位机CMD_NACK对应)

// 帧结构体
typedef struct {
    uint8_t sof;                    // 帧头
    uint8_t cmd;                    // 命令字
    uint16_t length;                // 数据长度
    uint8_t data[FRAME_MAX_SIZE];   // 数据缓冲区
    uint16_t crc16;                 // CRC16校验
} frame_t;

// 串口缓冲区结构体
typedef struct {
    uint8_t buf[FRAME_MAX_SIZE];
    uint8_t wr_index;
    uint8_t rd_index;
} uart_buffer_t;

// 全局变量声明
extern uart_buffer_t uart_buf;

// 函数声明
void app_update_process(void);
void enter_bootloader(void);
uint8_t uart_buf_write(uint8_t data);
void send_frame(uint8_t cmd, uint8_t *data, uint16_t length);
uint16_t calculate_crc16(uint8_t *data, uint16_t length);

#endif